/* ========================================
 *
 * Copyright Nano IC, 2021-02-25
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF Nano IC.
 *
 * ========================================
*/
#ifndef  __ONE_WIRE_BUS_PHY_H__
#define  __ONE_WIRE_BUS_PHY_H__
#include <csi_core.h>
#include "one_wire_bus_def.h"
#include "one_wire_bus_queue.h"
extern uint8_t volatile global_key_power_on_flag;
/**
 * @brief 物理层单总线时间片
 */
#define ONE_WIRE_BUS_PHY_SEND_INTERVAL              4//7  // ms
#define ONE_WIRE_BUS_PHY_SEND_INTERVAL_MIN          4  // ms
/**
 * @brief 物理层最多重传次数
 */
#define ONE_WIRE_BUS_PHY_MAX_RETRANS_NUM        3

/**
 * @brief :单总线物理层协议初始化
 * 
 * @param 
 * @return true : 成功
 * @return false : 失败
 */
bool one_wire_bus_phy_init(void);

/**
 * @brief : 调用串口驱动，发送一个数据包
 *
 * @param p_buf: 要发送的数据指针
 * @param len: 要发送的数据长度
 * @return  true: 发送成功
 * @return  false: 发送失败
 */
bool one_wire_bus_phy_uart_send_one_packet(uint8_t *p_buf,uint16_t len);

/** 
 * @brief 1. 串口连续23uS(2 Byte对应时间)未收到数据，表示一帧接收完成，调用一次本函数。
 * @brief 2. 由于单总线协议规定了串口数据传输间隔，若芯片硬件不支持23uS串口超时中断，可用
 * @brief    定时器控制串口接收超时，可以超时0.5mS来实现。
 * @brief 3. 串口会接收到对方数据，也会接收到自已发送的数据，可能是一个包，也可能是多包接连，
 * @brief    串口接收不用关心具体数据，只关心接收超时，超时后调用本函数。
 * @brief 4. 串口接收缓冲最大长度250 Byte
 * 
 * @param p_uart_data ：串口接收数据指针
 * @param rec_len ： 串口接收到的数据长度
 * 
 * @return 
 */
bool one_wire_bus_phy_rec_callback(uint8_t *p_uart_data,uint16_t rec_len);

/**
 * @brief 单总线动行时钟基准，系统需要每0.5mS调用一次本函数
 */
void one_wire_bus_phy_timer_tick_process_0_5ms(void);

/**
 * @brief 计算一段数据的累加和
 * 
 * @param p_buf 输入数据缓冲
 * @param len 输入数据长度
 * @return uint8_t 累加和低8 Bit
 */
uint8_t one_wire_bus_get_buf_sum(uint8_t * p_buf,uint8_t len);

/**
 * @brief 根据标志位，判断串口一个包是否发送成功
 *
 * @return true: 成功
 * @return false: 失败
 */ 
bool one_wire_bus_phy_get_send_status(void);

/**
 * @brief 设置发送成功否标志
 *
 * @return 
 */ 
void one_wire_bus_phy_set_send_status(bool flag);

/**
 * @brief 获取一帧新的数据
 *
 * @return true: 成功
 * @return false: 失败
 */ 
uint16_t one_wire_bus_phy_get_send_data_len(void);

/**
 * @brief 设置要发送数据长度
 *
 * @return 
 */ 
void one_wire_bus_phy_set_send_data_len(uint16_t len);

/**
 * @brief 获取一帧新的数据
 *
 * @return uint16_t: 获取数据长度
 */ 
uint16_t one_wire_bus_phy_obtain_new_data(void);



#endif

/* [] END OF FILE */

